package org.smart4j.framework.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.List;

/**
 * @author ：Anitaxiaofeng
 * @description： 代理管理器
 * @create 2017-12-16
 **/
public class ProxyManagr {
    //创建代理方法，输入一个目标类和一组Proxy接口实现，输出一个代理对象
    //参考CGLibProxy中的getProxy，jdk、cglib中返回代理对象的方法都是人家提供的直接调用就行，然后我们override intercept或者invoke方法
    //AopHelper调用
    //流程其实是先形成proxyChain，然后调用doProxyChain，然后调用proxyList中proxy的doProxy然后在回到doProxyChain调用下一个，直到完事，调用目的方法）
    public static <T> T createProxy(final Class<?> targetClass, final List<Proxy> proxyList){
        return (T) Enhancer.create(targetClass, new MethodInterceptor() {
            @Override
            public Object intercept(Object targetObject, Method targetMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
                return new ProxyChain(targetClass,targetObject,targetMethod,methodProxy,methodParams,proxyList).doProxyChain();
            }
        });
    }
}
